import logging
import os
import csv

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def read_spi_csv_file(file_path):
    """
    读取SPI CSV文件并解析数据

    Args:
        file_path (str): CSV文件的完整路径

    Returns:
        dict: 包含解析后SPI数据的字典
    """
    spi_data = {
        "header": {},
        "data": []
    }

    # 尝试多种编码方式读取文件
    encodings_to_try = ['utf-8', 'gbk', 'gb2312', 'big5', 'latin-1']

    for encoding in encodings_to_try:
        try:
            with open(file_path, 'r', encoding=encoding) as csvfile:
                # 使用csv模块读取文件
                csv_reader = csv.reader(csvfile)

                # 读取头部信息（前三行）
                header_lines = []
                for i in range(3):
                    try:
                        header_lines.append(next(csv_reader))
                    except StopIteration:
                        break

                # 解析头部信息
                if len(header_lines) >= 3:
                    # 第一行 - 模型和线号
                    if len(header_lines[0]) >= 2:
                        spi_data["header"]["model"] = header_lines[0][0].split(',')[0].strip()
                        spi_data["header"]["lineNumber"] = header_lines[0][1].strip()

                    # 第二行 - 产品信息
                    if len(header_lines[1]) >= 2:
                        spi_data["header"]["productInfo"] = header_lines[1][0].strip()
                        spi_data["header"]["machine"] = header_lines[1][1].strip()

                    # 第三行 - 板卡状态
                    if len(header_lines[2]) >= 2:
                        spi_data["header"]["boardStatus"] = header_lines[2][1].strip()

                # 读取列标题
                try:
                    columns = next(csv_reader)
                    spi_data["columns"] = [col.strip() for col in columns]
                except StopIteration:
                    spi_data["columns"] = []

                # 读取数据行
                for row in csv_reader:
                    # 跳过空行
                    if not row or all(cell.strip() == '' for cell in row):
                        continue

                    # 将数据行转换为字典
                    row_dict = {}
                    for i, value in enumerate(row):
                        if i < len(spi_data["columns"]):
                            column_name = spi_data["columns"][i]
                            # 尝试转换数值型数据
                            try:
                                if '.' in value:
                                    row_dict[column_name] = float(value)
                                elif value.isdigit():
                                    row_dict[column_name] = int(value)
                                else:
                                    row_dict[column_name] = value
                            except ValueError:
                                row_dict[column_name] = value

                    spi_data["data"].append(row_dict)

                logger.info(f"成功使用 {encoding} 编码读取CSV文件")
                return spi_data  # 成功读取，返回数据

        except UnicodeDecodeError:
            # 编码不匹配，尝试下一种
            if encoding == encodings_to_try[-1]:
                raise Exception(f"尝试了所有编码 ({', '.join(encodings_to_try)}) 但无法读取文件")
            continue

    return None  # 所有编码都尝试失败